/*
 * 1.00 2012/09/20
 *
 * Copyright (c) 2012 Motch_bs
 * All rights reserved.
 *
 * このソフトウェアは，Motch_bsに所有される機密情報である。
 * これらの機密情報を漏洩してはならず，Motch_bs の意図する
 * 認可の元においてこれを使用すべし。
 */
package jp.co.ufp.sevendaystask.listners;

import jp.co.ufp.sevendaystask.R;
import jp.co.ufp.sevendaystask.constants.C;
import jp.co.ufp.sevendaystask.dxo.QueryFormDxo;
import jp.co.ufp.sevendaystask.forms.QueryForm;
import jp.co.ufp.sevendaystask.logics.Logic001;
import jp.co.ufp.sevendaystask.storage.QueryAction;
import jp.co.ufp.sevendaystask.storage.QueryManager;
import android.app.AlertDialog;
import android.app.TimePickerDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TimePicker;
import android.widget.Toast;

/**
 * ボタンをクリックしたときの動作
 * 
 * @author Motch_bs
 * 
 */
public class QueryFormOnClickListener implements OnClickListener {

    /** 登録フォーム */
    private QueryForm form;

    /** 登録フォームから詰め替え */
    private QueryFormDxo dxo = new QueryFormDxo();

    /** データベースヘルパー */
    private QueryManager queryManager;

    /**
     * コンストラクタ
     * 
     * @param form
     * @param query
     */
    public QueryFormOnClickListener(QueryForm pForm, QueryManager pQueryManager) {
	super();
	this.form = pForm;
	this.queryManager = pQueryManager;
    }

    /**
     * @see android.view.View.OnClickListener#onClick(android.view.View)
     */
    @Override
    public void onClick(
	View v) {
	// 登録ボタン押下時
	if (v.getId() == R.id.btnQuery) {
	    // データベースをオープンする
	    SQLiteDatabase database = queryManager.getWritableDatabase();
	    QueryAction query = new QueryAction(database);
	    if (C.MODE_INSERT.equals(form.mode)) {
		int count = query.getCount(form.position_week);
		if (count >= C.TASK_MAX) {
		    showAlert(R.string.check_title, R.string.check_task_count);
		    return;
		}
	    }
	    ContentValues cv = dxo.convert(form);
	    // check
	    String timeStart = (String) cv.get(C.TIME_START);
	    if (timeStart == null || (timeStart != null & "".equals(timeStart))) {
		showAlert(R.string.check_title, R.string.check_time_start);
		return;
	    }
	    String timeEnd = (String) cv.get(C.TIME_END);
	    if (timeEnd == null || (timeEnd != null & "".equals(timeEnd))) {
		showAlert(R.string.check_title, R.string.check_time_end);
		return;
	    }
	    int iTimeStart = Integer.valueOf(timeStart).intValue();
	    int iTimeEnd = Integer.valueOf(timeEnd).intValue();
	    if (iTimeStart >= iTimeEnd) {
		showAlert(R.string.check_title, R.string.check_time_range);
		return;
	    }
	    String taskTitle = (String) cv.get(C.TASK_TITLE);
	    if (taskTitle == null || (taskTitle != null & "".equals(taskTitle))) {
		showAlert(R.string.check_title, R.string.check_task_title);
		return;
	    }

	    if (C.MODE_INSERT.equals(form.mode)) {
		query.doInsert(cv);
	    }
	    else if (C.MODE_UPDATE.equals(form.mode)) {
		query.doUpdaate(cv, form.iId);
	    }
	    database.close();
	    form.finish();
	}
	else if (v.getId() == R.id.btnPickerStart || v.getId() == R.id.timeStart) {
	    // 開始時刻
	    String timeStart = form.eTimeStart.getText().toString();
	    timeStart = Logic001.formatTime(timeStart);
	    if (timeStart != null) {
		String sStartHour = timeStart.substring(0, 2);
		String sStartMinute = timeStart.substring(2, 4);
		TimePickerDialog timePickerDialogStart = new TimePickerDialog(
			form,
			new TimePickerDialog.OnTimeSetListener() {
			    @Override
			    public void onTimeSet(
				TimePicker view, int iHour, int iMinute) {
				String hour = String.format("%02d", iHour);
				String minute = String.format("%02d", iMinute);
				form.eTimeStart.setText(hour + ":" + minute);
			    }
			},
			Integer.valueOf(sStartHour).intValue(),
			Integer.valueOf(sStartMinute).intValue(),
			true// 午前・午後ボタンあり（なしの場合はtrue）
		);
		timePickerDialogStart.show();
	    }
	    else {
		Toast.makeText(form, "Can't get Start time", Toast.LENGTH_SHORT).show();
	    }
	}
	else if (v.getId() == R.id.btnPickerEnd || v.getId() == R.id.timeEnd) {
	    // 終了時刻
	    String timeEnd = form.eTimeEnd.getText().toString();
	    timeEnd = Logic001.formatTime(timeEnd);
	    if (timeEnd != null) {
		String sEndHour = timeEnd.substring(0, 2);
		String sEndMinute = timeEnd.substring(2, 4);
		TimePickerDialog timePickerDialogEnd = new TimePickerDialog(
			form,
			new TimePickerDialog.OnTimeSetListener() {
			    @Override
			    public void onTimeSet(
				TimePicker view, int iHour, int iMinute) {
				String hour = String.format("%02d", iHour);
				String minute = String.format("%02d", iMinute);
				form.eTimeEnd.setText(hour + ":" + minute);
			    }
			},
			Integer.valueOf(sEndHour).intValue(),
			Integer.valueOf(sEndMinute).intValue(),
			true// 午前・午後ボタンあり（なしの場合はtrue）
		);
		timePickerDialogEnd.show();
	    }
	    else {
		Toast.makeText(form, "Can't get End time", Toast.LENGTH_SHORT).show();
	    }
	}
	// 削除ボタン押下時
	else {
	    if (v.getId() == R.id.btnDelete) {
		// データベースをオープンする
		SQLiteDatabase database = queryManager.getWritableDatabase();
		QueryAction query = new QueryAction(database);
		int count = query.getCount(form.position_week);
		if (count ==1 ) {
		    showAlert(R.string.check_title, R.string.check_task_count);
		    return;
		}
		query.doDelete(form.iId);
		// Toast.makeText(addForm, "Delete", Toast.LENGTH_SHORT).show();
		// addForm.finishFromChild(addForm);
		database.close();
		form.finish();
	    }
	}

    }

    private void showAlert(
	int title, int message) {
	AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(form);
	// アラートダイアログのタイトルを設定します
	alertDialogBuilder.setTitle(title);
	// アラートダイアログのメッセージを設定します
	alertDialogBuilder.setMessage(message);
	// アラートダイアログの肯定ボタンがクリックされた時に呼び出されるコールバックリスナーを登録します
	alertDialogBuilder.setPositiveButton(R.string.btnOk,
	    new DialogInterface.OnClickListener() {
		@Override
		public void onClick(
		    DialogInterface dialog, int which) {
		}
	    });
	// // アラートダイアログの中立ボタンがクリックされた時に呼び出されるコールバックリスナーを登録します
	// alertDialogBuilder.setNeutralButton(R.string.btnCancel,
	// new DialogInterface.OnClickListener() {
	// @Override
	// public void onClick(
	// DialogInterface dialog, int which) {
	// }
	// });
	// // アラートダイアログの否定ボタンがクリックされた時に呼び出されるコールバックリスナーを登録します
	// alertDialogBuilder.setNegativeButton(R.string.btnNo,
	// new DialogInterface.OnClickListener() {
	// @Override
	// public void onClick(
	// DialogInterface dialog, int which) {
	// }
	// });
	// アラートダイアログのキャンセルが可能かどうかを設定します
	// alertDialogBuilder.setCancelable(true);
	AlertDialog alertDialog = alertDialogBuilder.create();
	// アラートダイアログを表示します
	alertDialog.show();
    }
}
